package net.crozz.openapi.weibo;

import com.google.gson.reflect.TypeToken;
import net.crozz.openapi.ApiException;
import net.crozz.openapi.http.Param;
import net.crozz.openapi.http.Requester;
import net.crozz.openapi.weibo.model.account.Resp_get_privacy;
import net.crozz.openapi.weibo.model.account.Resp_get_uid;
import net.crozz.openapi.weibo.model.account.Resp_rate_limit_status;
import net.crozz.openapi.weibo.model.account.Resp_school_list;

import java.util.List;

public class Account {

    private Requester client;
    private String    baseURL;

    Account(Requester client, String baseURL) {
        this.client = client;
        this.baseURL = baseURL;
    }

    /**
     * OAuth授权之后，获取授权用户的UID<br/>
     * http://open.weibo.com/wiki/2/account/get_uid
     *
     * @param source       采用OAuth授权方式不需要此参数，其他授权方式为必填参数，数值为应用的AppKey。
     * @param access_token 采用OAuth授权方式为必填参数，其他授权方式不需要此参数，OAuth授权后获得。
     */
    public Resp_get_uid get_uid(String source, String access_token) throws ApiException {
        return client.getObj(
                Resp_get_uid.class,
                baseURL + "account/get_uid.json",
                Param.newParam("source", source),
                Param.newParam("access_token", access_token)
        );
    }

    /**
     * 获取当前登录用户的隐私设置<br/>
     * http://open.weibo.com/wiki/2/account/get_privacy
     *
     * @param source       采用OAuth授权方式不需要此参数，其他授权方式为必填参数，数值为应用的AppKey。
     * @param access_token 采用OAuth授权方式为必填参数，其他授权方式不需要此参数，OAuth授权后获得。
     */
    public Resp_get_privacy get_privacy(String source, String access_token) throws ApiException {
        return client.getObj(
                Resp_get_privacy.class,
                baseURL + "account/get_privacy.json",
                Param.newParam("source", source),
                Param.newParam("access_token", access_token)
        );
    }

    /**
     * 获取所有学校列表<br/>
     * http://open.weibo.com/wiki/2/account/profile/school_list<br/>
     * <b color='red'>参数keyword与capital二者必选其一，且只能选其一。
     * 按首字母capital查询时，必须提供province参数</b>
     *
     * @param source       采用OAuth授权方式不需要此参数，其他授权方式为必填参数，数值为应用的AppKey。
     * @param access_token 采用OAuth授权方式为必填参数，其他授权方式不需要此参数，OAuth授权后获得。
     * @param province     非必填    省份范围，省份ID。
     * @param city         非必填    城市范围，城市ID。
     * @param area         非必填    区域范围，区ID。
     * @param type         非必填    学校类型，1：大学、2：高中、3：中专技校、4：初中、5：小学，默认为1。
     * @param capital      非必填     学校首字母，默认为A。
     * @param keyword      非必填     学校名称关键字。
     * @param count        非必填    返回的记录条数，默认为10。
     */
    public List<Resp_school_list> school_list(
            String source,
            String access_token,
            Integer province,
            Integer city,
            Integer area,
            Integer type,
            String capital,
            String keyword,
            Integer count
    ) throws ApiException {
        return client.getObj(
                new TypeToken<List<Resp_school_list>>() {
                }.getType(),
                baseURL + "account/profile/school_list.json",
                Param.newParam("source", source),
                Param.newParam("access_token", access_token),
                Param.newParam("province", province),
                Param.newParam("city", city),
                Param.newParam("area", area),
                Param.newParam("type", type),
                Param.newParam("capital", capital),
                Param.newParam("keyword", keyword),
                Param.newParam("count", count)
        );
    }

    /**
     * 获取当前登录用户的API访问频率限制情况<br/>
     * http://open.weibo.com/wiki/2/account/rate_limit_status
     *
     * @param source       采用OAuth授权方式不需要此参数，其他授权方式为必填参数，数值为应用的AppKey。
     * @param access_token 采用OAuth授权方式为必填参数，其他授权方式不需要此参数，OAuth授权后获得。
     */
    public Resp_rate_limit_status rate_limit_status(String source, String access_token) throws ApiException {
        return client.getObj(
                Resp_rate_limit_status.class,
                baseURL + "account/rate_limit_status.json",
                Param.newParam("source", source),
                Param.newParam("access_token", access_token)
        );
    }

}
